"""
此脚本方便将项目代码整合到一起发给大模型解析

使用方法：
  python code_to_md.py models utils viewmodels views app.py -o 项目代码整合.md

返回状态码说明：
  0：成功执行且没有跳过任何文件
  1：没有找到任何 Python 文件
  2：部分文件处理失败
"""

import argparse
from pathlib import Path
import sys


def find_py_files(paths):
    """查找所有Python文件（支持目录和单个文件）

    Args:
        paths: 要处理的路径列表（可以是目录或.py文件）

    Returns:
        list: 包含所有找到的.py文件绝对路径的列表（去重）
    """
    py_files = set()  # 使用集合避免重复

    for path_str in paths:
        path_obj = Path(path_str)

        if not path_obj.exists():
            print(f"警告：路径不存在 {path_obj}", file=sys.stderr)
            continue

        # 处理单个Python文件
        if path_obj.is_file() and path_obj.suffix == '.py':
            py_files.add(path_obj.resolve())
            continue

        # 处理目录
        if path_obj.is_dir():
            for file_path in path_obj.rglob('*.py'):
                if file_path.is_file():
                    py_files.add(file_path.resolve())
            continue

        print(f"警告：跳过非常规文件 {path_obj}", file=sys.stderr)

    return sorted(py_files)  # 返回排序后的列表保证可重复性


def write_to_markdown(files, output_file):
    """将文件内容写入Markdown文档

    Args:
        files: 要处理的文件路径列表
        output_file: 输出文件路径

    Returns:
        tuple: (成功写入的文件数, 跳过文件数)
    """
    success = 0
    skipped = 0

    with open(output_file, 'w', encoding='utf-8') as md_file:
        for file_path in files:
            try:
                # 读取文件内容（使用UTF-8编码）
                with file_path.open('r', encoding='utf-8') as f:
                    content = f.read()

                # 新增：跳过空文件（包含只有空白字符的情况）
                if not content.strip():
                    print(f"跳过空文件：{file_path}", file=sys.stderr)
                    skipped += 1
                    continue

                # 写入Markdown标题和代码块
                md_file.write(f"## {file_path}\n\n```python\n{content}\n```\n\n")
                success += 1
            except UnicodeDecodeError:
                print(f"解码错误：无法读取 {file_path}（非UTF-8编码）", file=sys.stderr)
                skipped += 1
            except PermissionError:
                print(f"权限不足：无法读取 {file_path}", file=sys.stderr)
                skipped += 1
            except Exception as e:
                print(f"处理 {file_path} 时发生错误：{str(e)}", file=sys.stderr)
                skipped += 1

    return success, skipped


def main():
    # 正确的参数解析
    parser = argparse.ArgumentParser(
        description='将多个目录或Python文件导出到Markdown文档',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument(
        'paths',
        nargs='+',
        help='要处理的路径列表（可以是目录或.py文件）')
    parser.add_argument(
        '-o', '--output',
        default='output.md',
        help='输出的Markdown文件路径')

    args = parser.parse_args()

    # 查找所有Python文件
    print("正在搜索Python文件...")
    py_files = find_py_files(args.paths)  # 使用正确的参数名称

    if not py_files:
        print("错误：没有找到任何Python文件", file=sys.stderr)
        sys.exit(1)

    # 写入Markdown文件
    print(f"正在将 {len(py_files)} 个文件写入 {args.output}...")
    success, skipped = write_to_markdown(py_files, args.output)

    # 输出统计信息
    print(f"\n操作完成：")
    print(f"成功处理文件数: {success}")
    print(f"跳过文件数:     {skipped}")

    if skipped > 0:
        sys.exit(2)


if __name__ == "__main__":
    main()
